# Perfetto 快速上手指南
# 1. Perfetto 是什么?
Perfetto 是 google 从 Android10 开始引入的一个全新的平台级跟踪分析工具。它可以记录 Android 系统运行过程中的关键数据,并通过图形化的形式展示这些数据。Perfetto 不仅可用于系统级的性能分析,也是我们学习系统源码流程的好帮手。
# 2. 如何抓取 Trace
使用 Perfetto 一般分两步进行:
- 收集手机运行过程中的信息,这些信息通常称之为 Trace,收集的过程称之为抓取 Trace。
- 使用 Perfetto 打开 Trace 文件,分析 Trace
本节介绍如何抓取 Trace 。
# 2.1 使用命令行抓取 Trace
# 2.1.1 使用 perfetto 命令抓取
首先使用 usb 线将电脑和手机连接,确保 adb shell
命令能正常工作。
接着执行下面的命令:
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
2
这个命令会启动一个 20 秒钟的跟踪,收集指定的数据源信息,并将跟踪文件保存到 /data/misc/perfetto-traces/trace_file.perfetto-trace
最后,把 trace 文件 pull 出来:
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
整个抓取过程就完成了。
# 2.1.2 使用 record_android_trace 命令抓取
record_android_trace 是 Perfetto 团队提供的一个简化脚本,使得我们的抓取工作更加简单。
# 可能需要梯子
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
chmod u+x record_android_trace
./record_android_trace -o trace_file.perfetto-trace -t 10s -b 64mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
2
3
4
5
record_android_trace 命令能自动处理好路径,抓取完成后自动打开 Trace 文件。
# 2.2 使用 UI 工具抓取
# 2.2.1 Perfetto UI 抓取
Perfetto 也提供了图形化的工具来抓取 Trace,这种方法更简单直观。
该工具以网站的方式提供:https://ui.perfetto.dev/#!/record
打开网站后,第一步,完成基本的设置:
- 左侧 tab 栏,选择 Record new trace 选项
- 使用 usb 线连接好手机和电脑后,选项好目标平台
- 选择抓取的模式
- Stop when full,抓取的 trace 达到设置的容量后就停止(常用)
- Ring buffer,环形缓存,设置的容量满了后会被覆盖
- Long Trace,任性,一直记录
第二步,配置我们要抓取的内容:
CPU 的选项一般都会选上。
App 相关内容我们都选上
把调用栈选上,这对我们分析代码很有帮助。
最后点击,右上角的 Start Recording
就开始抓取了。抓取完成后会自动打开 trace 文件,非常方便。
# 2.3 使用配置文件简化命令行抓取
在使用 Perfetto UI 抓取时,当我们配置好以后。
进入到 Recording command
,然后把右侧两个 EOF
之间的内容复制下来,保存在 config.pbtx 配置文件中。
接着就可以用这个配置文件来抓取 Trace 了:
./record_android_trace -c config.pbtx -o trace_file.perfetto-trace -t 10s -b 64mb
# 3. Perfetto 使用基础
# 3.1 进入 Perfetto Trace 界面
使用 record_android_trace 命令或者 Perfetto UI 抓取 Trace 后,会自动打开 Perfetto Trace 界面。
使用 perfetto 命令抓取 Trace 后,需要手动打开 Perfetto Trace 界面。打开的方法如下:
使用浏览器打开 https://ui.perfetto.dev/ 界面如下:
可以把 trace 文件直接拖到浏览器中,也可以通过左上角的 Open trace file
打开 trace 文件。
# 3.2 Perfetto Trace 界面基本内容
Perfetto Trace 界面大致可分为 4 个区域:
- 操作区,主要用到 Current Trace 下的几个选项
- Show timeline :显示当前 Trace,切到了别的界面之后,再点这个就会回到 Trace View 界面
- Query:写 SQL 查询语句和查看执行结果的地方
- Metrics:官方默认帮你写好的一些分析结果
- Info and stats :当前 Trace 和手机 App 的一些信息
- 信息区:时间与搜索。
- Trace 内容区:图形化展示 Trace 的区域
- 信息区:展示Trace 内容区中选择中的元素的详细信息
在 Trace 内容区中,可以通过 w/s 按键缩小放大界面, a/d 移动界面。
Trace 内容区中主要有以下一些元素:
# 3.2.1 slice,片段
鼠标单击后会有一个黑框包围住,信息区会显示相关信息:
slice 代表了一段代码的执行过程,在代码中起于 Trace.traceBegin \ ATRACE_BEGIN
,终于 Trace.traceEnd \ ATRACE_END
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
2
3
4
# 3.2.2 counter,计数器
用于记录一些关键数据
对应于代码中的 Trace.traceCounter/ATRACE_INT
:
ATRACE_INT(ftl::Concat("HW_VSYNC_", displayIdOpt->value).c_str(),
displayData.vsyncTraceToggle);
2
# 3.2.3 CPU Sched Slice, cpu 调度片段
用于展示 cpu 的调度情况
# 3.2.4 thread_state,线程状态
点击片段上方线程调度信息片段(Running),可以看到线程当前运行在哪个CPU上
点击信息区中的 Running on CPU 7
旁边的斜箭头:
可以在 CPU 调度中看到该运行片段
再次点击斜箭头,可以回到原来位置
这里选择的 thread_state 是 App 的主线程,由用户点击屏幕唤醒运行,实际很多线程都是由其他线程/进程唤醒的,比如在 CPU 调度中选择一个 Slice:
信息区右侧的意思是当前 thread 由 P(Process)/system/bin/surfaceflinger [584]
中的 T(Thread)app [689]
唤醒。
线程从就绪到运行延迟了 48us 381ns
# 3.3 Perfetto Trace 界面基本操作
当我们选中一个片段时,点击 m,就可以做一个临时的标记,当标记另一个片段以后,前一个零时标记就会取消。
选中一个片段以后,如果点击 shift + m
,就会添加一个普通标记。
标记以后,会出现两个小三角:
点击小三角后,信息区会出现一个 remove 按键:
点击即可取消
快捷键 q,可以快速打开关闭信息区。
# 4. 线程信息查看
# 5. 基本使用技巧
# 5.1 查看 Task 唤醒源
# 5.2 查看 Critical Path(Task)
Critical Task 指的是与当前我们选中的 Task 有依赖关系的 Task,比如我们的 Task 是 e,e 要等 d 执行结束后才能执行,d 要等 c,c 要等 b,b 要等 a,那么 e 的 Critical Task 就是 a、b、c、d。
# 参考资料
- perfetto 官方文档 (opens new window)
- Android Perfetto 系列 1:Perfetto 工具简介 (opens new window)
- Android Perfetto 系列 3:熟悉 Perfetto View (opens new window)
- Perfetto分析进阶 (opens new window)
- perfetto/systrace基础知识讲解 (opens new window)
- 使用 Perfetto 分析你的 Android 应用性能 (opens new window)
- Perfetto详细解析 (opens new window)